﻿using System;
using System.IO;
using System.Web;

namespace AJAX_learning
{
		/// <summary>
	/// Summary description for SourceHandler
	/// </summary>
	public class SourceHandler : IHttpHandler
	{
		public void ProcessRequest(HttpContext context)
		{
			// Делаем легкодоступными объекты содержимого HTTP.
			HttpResponse response = context.Response;
			HttpRequest request = context.Request;
			HttpServerUtility server = context.Server;
			if(!request.IsLocal)
			{
				response.Write("<b>Forbidden</b>");
				return;
			}
			response.Write("<html><body>");
			// Получаем имя запрашиваемого файла.
			string file = request.QueryString["file"];
			try
			{
				// Открываем файл и отображаем его содержимое
				// одновременно в одной строке.
				response.Write("<b>Listing " + file + "</b><br />");
				using (StreamReader r = File.OpenText(server.MapPath(Path.Combine("./", file))))
				{
					string line = "";
					while (line != null)
					{
						line = r.ReadLine();
						if (line != null)
						{
							// Убеждаемся в том, что дескрипторы и другие
							// специальные символы заменяются соответствующими
							// объектами HTML, чтобы они могли
							// отображаться должным образом.
							line = server.HtmlEncode(line);
							// Заменяем пробелы и символы табуляции
							// неразрываемыми пробелами,
							// чтобы избавиться от пропусков.
							line = line.Replace(" ", "&nbsp;");
							line = line.Replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
							// В более сложном средстве просмотра исходного кода
							// могут применяться цвета для выделения кода.
							response.Write(line + "<br />");
						}
					}
				}
			}
			catch (Exception err)
			{
				response.Write(err.Message);
			}
			response.Write("</html></body>");
		}
		public bool IsReusable
		{
			get { return true; }
		}
	}
}